import { Button, Result } from 'antd';
import { ReactNode, useEffect, useState } from 'react';
/**
 * 错误边界组件
 *
 * 用于捕获子组件树中的JavaScript错误，并显示备用UI而不是崩溃整个应用。
 *
 * @param children - 子组件
 * @returns 返回渲染的子组件或备用UI
 */
function ErrorBoundary({ children }: { children: ReactNode }) {
    /* 数据管理--------------------------------------------------- */
    const [hasError, setHasError] = useState(false);

    /* 逻辑代码 -------------------------------------------------------------*/
    const goHome = () => {
        // 导航到首页
        window.location.hash = '#/';
        window.location.reload();
    };

    /* hooks ---------------------------------------------------- */
    useEffect(() => {
        /**
         * 错误处理函数
         *
         * @param ev 事件对象或错误信息字符串
         */
        // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
        const errorHandler = (event: ErrorEvent) => {
            console.log('捕获到全局错误', event.message);
            setHasError(true);
        };
        // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
        const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {
            console.log('捕获到全局Promise拒绝错误', event.reason);
            setHasError(true);
        };

        // 捕获全局错误事件
        window.addEventListener('error', errorHandler, true);
        window.addEventListener('unhandledrejection', unhandledrejectionHandler, true);

        // 组件卸载时移除事件监听
        return () => {
            window.removeEventListener('error', errorHandler, true);
            window.removeEventListener('unhandledrejection', unhandledrejectionHandler, true);
        };
    }, []);

    if (hasError) {
        return (
            <Result
                status="warning"
                subTitle="抱歉，页面似乎出错了"
                extra={
                    <Button
                        type="primary"
                        onClick={goHome}
                    >
                        返回首页
                    </Button>
                }
            />
        );
    }

    return children;
}
export default ErrorBoundary;
